#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef struct {
    char id[6];
	char nombre[20];
    char nota[3];
} reg;

static const char path[] = "califications.dat";

void deserializeLine(char data[100], reg* r) {
	char *tok;
	
	tok = strtok(data,";");
	strcpy(r->id, tok);
	strcat(r->id, "\0");
	
	tok = strtok(NULL,";");
	strcpy(r->nombre, tok);
	strcat(r->nombre, "\0");
	
	tok = strtok(NULL,";");
	strcpy(r->nota, tok);
	strcat(r->nota, "\0");
}

void serializeLine(reg r, char *line) {
	sprintf(line, "%s;%s;%s", r.id, r.nombre, r.nota);
}

int load(reg *db, int *size) {
	char str[50];
	reg reg_tmp;
	int size_tmp = 0;
	FILE *fp;
	fp=fopen(path, "r");
	if(fp != NULL) {
		while (fscanf(fp, "%s\n", str) != EOF) {
			deserializeLine(str, &reg_tmp);
			printf("%s\n", str);
			db[size_tmp] = reg_tmp;
			size_tmp++;
		}
		*size = size_tmp;
		fclose(fp);
		return 0;
	} else
		printf("Error leyendo el archivo. Código de error: %i - ", errno);
	return 1;
}


int save(reg *db, int size) {
	char str[100];
	int i;
	FILE *fp;
	fp=fopen(path, "w");
	if(fp != NULL) {
		for(i = 0; i < size; i++) {
			serializeLine(db[i], str);
			fprintf(fp, "%s\n", str);
		}
		fclose(fp);
		return 0;
	}
	return 1;
}

int getNota(char *id, reg *r) {
	reg* db = malloc(20 * sizeof(reg));
	int size;
	if(load(db, &size) == 0) {
		int i;
		for(i = 0; i < size; i++) {
			if(strcmp(db[i].id, id) == 0) {
				*r = db[i];
				return 0;
			}
		}
		return -1;
	}
	
	return -2;
}

int setNota(char *id, char *nota) {
	reg* db = malloc(20 * sizeof(reg));
	int size;
	if(load(db, &size) == 0) {
		int i;
		for(i = 0; i < size; i++)
			if(strcmp(db[i].id, id) == 0) {
				strcpy(db[i].nota, nota);
				save(db, size);
				return 0;
			}
	}	
	return 1;
}
